package com.demo.cn.rxjavademo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subjects.Subject;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    TextView viewById;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        viewById = (TextView) findViewById(R.id.btn);
        viewById.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

//                rxjava与retrofit的组合使用
                // 第2部分：在创建Retrofit实例时通过.baseUrl()设置
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http://222.68.185.232:9080/EntityChannelInteface/") //设置网络请求的Url地址
                        .addConverterFactory(new ToStringConverterFactory())
                         .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .build();
                ApiServices apiServices = retrofit.create(ApiServices.class);
                apiServices.getCall().subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Subject<String>() {
                   @Override
                   public boolean hasObservers() {
                       return false;
                   }

                   @Override
                   public boolean hasThrowable() {
                       return false;
                   }

                   @Override
                   public boolean hasComplete() {
                       return false;
                   }

                   @Override
                   public Throwable getThrowable() {
                       return null;
                   }

                   @Override
                   protected void subscribeActual(Observer<? super String> observer) {

                   }

                   @Override
                   public void onSubscribe(Disposable d) {

                   }

                   @Override
                   public void onNext(String value) {
                       Log.e(TAG, "onNext: "+Thread.currentThread().getName());
                       viewById.setText(value);
                       Log.e(TAG, "onNext: "+value );
                   }

                   @Override
                   public void onError(Throwable e) {

                   }

                   @Override
                   public void onComplete() {

                   }
               })
              ;










//               observable = Observable.create(new Observable.OnSubscribe<String>() {
//
//                    // 下面subscribeOn(Schedulers.newThread()) 把这方法设定在新线程回调
//                    @Override
//                    public void call(final Subscriber<? super String> subscriber) {
//
//                            subscriber.onNext("this is response result");
//                            subscriber.onCompleted();
//
//                    }
//                })
//                        .subscribeOn(Schedulers.newThread()); // 设置call(...)方法，在新线程回调;

//                 RxJava 2.0 中 创建被观察者
// 变化1：Observable.OnSubscribe接口名改成ObservableOnSubscribe
//                Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
//
//                    // 变化2：复写的call（Subscriber）改成 subscribe （ObservableEmitter）
//                    // 注：参数也发生了变化，即Subscriber -> ObservableEmitter = 发射器
//                    @Override
//                    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
//                        // 可发出三种类型的事件：next事件、complete事件&error事件
//                        // 通过调用emitter.onNext(T value) 、onComplete()和onError(Throwable e)
//                        e.onNext(1);
//                        e.onNext(2);
//                        e.onError(new Exception("发生错误了"));
//                        e.onComplete();
//                    }
//                }).subscribeOn(Schedulers.newThread());

//
//                observable.observeOn(AndroidSchedulers.mainThread())
//                        .subscribe(new Subject<Integer>() {
//                            @Override
//                            public boolean hasObservers() {
//                                return false;
//                            }
//
//                            @Override
//                            public boolean hasThrowable() {
//                                return false;
//                            }
//
//                            @Override
//                            public boolean hasComplete() {
//                                return false;
//                            }
//
//                            @Override
//                            public Throwable getThrowable() {
//                                return null;
//                            }
//
//                            @Override
//                            protected void subscribeActual(Observer<? super Integer> observer) {
//
//                            }
//
//                            @Override
//                            public void onSubscribe(Disposable d) {
//
//                            }
//
//                            @Override
//                            public void onNext(Integer value) {
//                                Log.e(TAG, "onNext: " + value);
//                            }
//
//                            @Override
//                            public void onError(Throwable e) {
//
//                            }
//
//                            @Override
//                            public void onComplete() {
//                                Log.e(TAG, "onComplete: ");
//                            }
//                        });


//                observable.observeOn(AndroidSchedulers.mainThread())// 让下面onNext()、onError()、onComplete()在UI线程(主线程)回调
//                        .subscribe(new Subscriber<String>() {
//                            @Override
//                            public void onNext(String result) { // 上面 subscriber.onNext(result)在这里回调
//                                // 返回的字符串(通常是一个json)，解析成User对象
//
//                        viewById.setText(result);
//                                Log.e(TAG, "onNext: "+result );
//
//                            }
//
//                            @Override
//                            public void onError(Throwable e) {
//                                Log.e(TAG, "onError: "+e );
//                            } // 上面subscriber.onError(new Throwable(msg))在这里回调
//
//                            @Override
//                            public void onCompleted() {
//                                Log.e(TAG, "onCompleted: " );
//                            }
//                        });
//            }
//        });

// 可封装得更美观 Observable<String> observable = UserHttp.create(userid);


            }
        });
    }


    public class ToStringConverterFactory extends Converter.Factory {
        private  final MediaType MEDIA_TYPE = MediaType.parse("text/plain");


        @Override
        public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
            if (String.class.equals(type)) {
                return new Converter<ResponseBody, String>() {
                    @Override
                    public String convert(ResponseBody value) throws IOException {
                        return value.string();
                    }
                };
            }
            return null;
        }

        @Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
                                                                        Annotation[] methodAnnotations, Retrofit retrofit) {
            if (String.class.equals(type)) {
                return new Converter<String, RequestBody>() {
                    @Override
                    public RequestBody convert(String value) throws IOException {
                        return RequestBody.create(MEDIA_TYPE, value);
                    }
                };
            }
            return null;
        }
    }
}
